home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
embedded
/
mcu
/
float09.arc
/
FLOAT.SA
< prev
next >
Wrap
Text File
|
1987-03-04
|
2KB
|
137 lines
NAM FLOAT
******************************************************
*
* PROCEDURE FLOAT
* FLOAT CONVERTS A BINARY INTEGER TO A FLOATING
* REPRESENTATION. THE INPUT ARGUMENT CAN EIHTER BE
* A 16 OR 32 BIT SIGNED INTEGER. IF THE ARGUMENT
* IS 32 BIT LONG AND THE DESTINATION IS SINGLE
* THEN THE VALUE IS ROUNDED ONCE.
*
* ON ENTRY:
* U IS A STACK FRAME POINTER
*
* ON EXIT:
* RESULT CONTAINS A FLOATING VALUE REPRESENTING
* THE BINARY INTEGER.
*
FLOAT EQU *
*
LEAX RESULT,U
LDB #ARGSIZ-1
WHILE B,GE,#00
CLR B,X
DECB
*
ENDWH
*
* SET EXPONENT TO PROPER VALUE
*
LDA FUNCT,U CHECK FUNCTION
IF A,EQ,#FCFLTS SINGLE PRECISION FLOAT
LEAY SINTSZ,PCR
*
ELSE
LEAY DINTSZ,PCR DOUBLE PRECISION FLOAT
*
ENDIF
*
* MOVE INTEGER TO RESULT
*
MOVD (0,Y),(EXPR,U)
*
MOVD (FRACT2,U),(FRACTR,U)
LDA FUNCT,U CHECK FUNCTION
IF A,EQ,#FCFLTD DOUBLE PREC. FLOAT
MOVD (FRACT2+2,U),(FRACTR+2,U)
*
ENDIF
*
* CHECK SIGN OF INTEGER AND NEGATE THE INTEGER
* IF NECESSARY.
*
LDA FRACTR,U
IFCC LT SIGN NEGATIVE
LDA #$80 SET SIGN NEGATIVE
STA RESULT,U
*
LEAX FRACTR,U
LDA FUNCT,U CHECK FUNCTION
IF A,EQ,#FCFLTS SINGLE PRECISION
COM 0,X
NEG 1,X
BCS OUT
INC 0,X
*
ELSE
COM 0,X
COM 1,X
COM 2,X
NEG 3,X
BCS OUT
INC 2,X
BNE OUT
INC 1,X
BNE OUT
INC 0,X
*
ENDIF SINGLE PRECISION
*
OUT EQU *
*
ENDIF INTEGER NEGATIVE
*
* NORMALIZE RESULT
*
LEAX RESULT,U
*
LBSR SNORM
*
* IF THE ARGUMENT WAS 32 BITS LONG AND THE PRECISION
* IS SINGLE, THEN ROUND THE RESULT TO YIELD EXACT
* REPRESENTATION
*
LDA FUNCT,U
IF A,EQ,#FCFLTD DOUBLE PRECISION FLOAT
LDA [PFPCB,U]
ANDA #BIT7+BIT6+BIT5
IF A,EQ,#PRSIN SINGLE PRECISION
BRA RND
*
ELSE
IF A,EQ,#PREFS FORCE TO SINGLE
*
RND EQU *
*
LDB #FRACT+3 G-BYTE OFFSET
LDA B,X GET G-BYTE
LSLA GET RID OF MSBIT
*
INCB
WHILE B,LT,#(ARGSIZ-1)
ORA B,X
INCB
*
ENDWH
*
STA STIKY,U SET STIKY BYTE
*
LBSR ROUND ROUND RESULT
*
ENDIF
ENDIF SINGLE PRECISION
*
ENDIF DOUBLE PRECISION FLOAT
*
*
RTS RETURN
*
*
* INTEGER SIZE TABLE
*
SINTSZ FDB 15
DINTSZ FDB 31
*
*
*